# -*- coding: utf-8 -*-
# @File  : 进程池2.py
# @Author: zbh
# @Date  : 2025/2/25_15:31

'''
进程池的数量不一定非要和 CPU 核数一样，这需要根据具体的任务类型和系统资源情况来综合考虑，下面为你详细分析：

### 进程池数量设置为 CPU 核数的情况
#### 适用于 CPU 密集型任务
当执行的任务主要是 CPU 密集型任务时，例如进行大量的数值计算、图像和视频处理等，这类任务需要大量的 CPU 计算资源，CPU 会一直处于忙碌状态。在这种情况下，将进程池的数量设置为 CPU 核数是比较合适的。
因为操作系统的调度机制可以让每个进程在一个 CPU 核心上运行，充分利用 CPU 的并行计算能力。如果进程数量超过 CPU 核数，进程之间会频繁地进行上下文切换，增加额外的开销，反而会降低整体的性能。

以下是一个简单的 CPU 密集型任务示例：
```python
import multiprocessing
import math

def cpu_intensive_task(n):
    return sum(math.sqrt(i) for i in range(n))

if __name__ == "__main__":
    num_cpus = multiprocessing.cpu_count()
    pool = multiprocessing.Pool(processes=num_cpus)
    results = pool.map(cpu_intensive_task, [1000000] * num_cpus)
    pool.close()
    pool.join()
    print(results)
```
在上述代码中，将进程池的大小设置为 CPU 核数，以充分利用 CPU 资源来处理 CPU 密集型任务。

### 进程池数量不设置为 CPU 核数的情况
#### 对于 I/O 密集型任务
如果任务是 I/O 密集型的，例如网络请求、文件读写等，这类任务在进行 I/O 操作时，CPU 会处于空闲状态。此时，进程池的数量可以设置得比 CPU 核数大，因为在一个进程进行 I/O 操作时，CPU 可以调度其他进程继续执行，从而提高整体的效率。
例如，在进行大量的网络请求时，每个请求可能需要等待服务器的响应，在等待的过程中，CPU 可以去处理其他进程的任务。

以下是一个简单的 I/O 密集型任务示例：
```python
import multiprocessing
import time

def io_intensive_task():
    time.sleep(2)  # 模拟 I/O 操作
    return "Task completed"

if __name__ == "__main__":
    num_cpus = multiprocessing.cpu_count()
    # 可以将进程池数量设置得比 CPU 核数大
    pool = multiprocessing.Pool(processes=num_cpus * 2)
    results = pool.map(io_intensive_task, [None] * 10)
    pool.close()
    pool.join()
    print(results)
```
在这个例子中，将进程池的数量设置为 CPU 核数的两倍，以充分利用 CPU 在 I/O 等待期间的空闲时间。

#### 受系统资源限制
除了任务类型，系统的其他资源（如内存、磁盘 I/O 带宽等）也会影响进程池的数量。如果每个进程需要占用大量的内存，过多的进程可能会导致系统内存不足，从而影响系统的稳定性和性能。因此，在设置进程池数量时，需要综合考虑系统的整体资源情况。

综上所述，进程池的数量需要根据任务类型和系统资源等因素进行合理设置，不一定非要和 CPU 核数一样。

'''



from multiprocessing import Pool as ProcessPool
import time
import os

def work_func(num):
    print(f"This is {num}")
    res = 0
    for i in range(10000000): # 计算密集型任务
        res *= i

def main():
    start = time.time()
    for i in range(32): # 32个进程
        work_func(i)
    time1 = time.time() - start # 计算密集型任务，单进程耗时
    print(f"单线程执行耗时是：{time1}")
    cpu_num = os.cpu_count()
    print(f"当前电脑cpu的核数是：{cpu_num}")
    pool=ProcessPool(processes=64) # 创建进程池, 进程数为32
    start2 = time.time()
    pool.map(work_func,range(32)) # 计算密集型任务，多进程耗时
    pool.close()  # 关闭进程池
    pool.join()  # 等待所有进程执行完毕
    time2 = time.time() - start2
    print(f"多线程执行耗时是：{time2}")




if __name__ == "__main__":
    main()


